import 'package:flutter/cupertino.dart';
import 'package:xindong/manager/xindong_user_controller.dart';
import 'package:xindong/widgets/dialog/xindong_base_alert.dart';

// 对话框队列管理
//
// 目前包含：城市切换、版本升级
class XinDongDialogQueue {
  // 是否显示中
  bool isShow = false;
  XinDongDialogElement? showElement;

  // 对话框列表
  List<XinDongDialogElement> dialogList = [];

  // 添加到队列
  //
  // object 对话元素
  // showNow 是否立即显示（默认false，等到首页时手动显示）
  void addQueue(XinDongDialogElement object, {bool showNow = false}) {
    bool have = dialogList.any((element) => element.key == object.key);
    if (have) {
      return;
    }
    dialogList.add(object);
    if (showNow) {
      show(isUpgrade: object.key == "VersionDialog");
    }
  }

  // 显示
  Future<void> show({bool isUpgrade = false}) async {
    if (isShow == true || dialogList.isEmpty) {
      if (isUpgrade) {
        if (showElement != null) {
          dialogList.remove(showElement);
        }
      } else {
        return;
      }
    }
    dialogList.sort((left, right) => right.priority.index.compareTo(left.priority.index));
    XinDongDialogElement element = dialogList.first;
    // 限定用户到弹窗，匹配不合适就移出队列
    if (element.userId != null) {
      if (!XinDongUserController.to.isUserCompleted) {
        dialogList.remove(element);
        show();
        return;
      }
      final userId = XinDongUserController.to.loginId;
      if (userId != element.userId) {
        dialogList.remove(element);
        show();
        return;
      }
    }
    isShow = true;
    showElement = element;
    var result = await showAlertDialog(alert: element.dialog);
    isShow = false;
    // 消失之后再移除，必须显示过程中再插入同样当
    showElement = null;
    try {
      /// 可能已经被销毁
      dialogList.remove(element);
    } catch (e) {}

    // 当用户选择取消时，继续弹窗下一个窗口
    if (result == null || result == false) {
      show();
    }
  }

  // 账号退出时清除所有
  void clear() {
    dialogList.clear();
  }

  // ======== 单例
  // 工厂方法构造函数
  factory XinDongDialogQueue() => _getInstance();

  // instance的getter方法，singletonManager.instance获取对象
  static XinDongDialogQueue get instance => _getInstance();

  // 静态变量_instance，存储唯一对象
  static XinDongDialogQueue? _instance;

  // 获取对象
  static XinDongDialogQueue _getInstance() {
    _instance ??= XinDongDialogQueue._internal();
    return _instance!;
  }

  // 私有的自定义命名式构造方法，通过它实现一个类;
  // 子类不能继承internal
  // 不是关键字，可定义其他名字
  XinDongDialogQueue._internal() {
    //初始化(设置一些默认的)...
  }
}

// 优先级
enum XinDongDialogPriority {
  normal, //默认弹窗，按顺序弹出
  high, //高优先级弹窗，回收normal弹窗，优先显示（指纹引导弹窗、提交请求弹窗）
}

// 元素
class XinDongDialogElement {
  final String key; // Key，已经存在就不再添加
  final XinDongDialogPriority priority; // 优先级
  final String? userId; // 用户id，存在的话需要匹配用户才显示，其他用户不显示
  Widget dialog;

  XinDongDialogElement(
      {required this.key, this.priority = XinDongDialogPriority.normal, this.userId, required this.dialog});
}
